package thread;

/**
 * 静态方法的同步
 * 当一个静态方法使用synchronized修饰后,该方法一定具有同步效果
 *
 * 静态方法上使用synchronized时,同步监视器对象是当前类的类对象(Class的实例)
 * Class类称为类对象.JVM加载一个类时会实现一个Class实例用来表示加载的这个类
 * 因此每个被JVM加载的类都有且只有一个Class的实例与之对应,而这个Class实例就
 * 称为这个类的类对象
 * 类对象会在后期反射的知识点讲解.
 */
public class SyncDemo3 {
    public static void main(String[] args) {
        Thread t1 = new Thread(){
            public void run(){
                    Boo.dosome();
            }
        };
        Thread t2 = new Thread(){
            public void run(){
                Boo.dosome();
            }
        };
        t1.start();
        t2.start();
    }
}
class Boo{
   // public synchronized static void dosome() {
    public static void dosome() {
        /*
            静态方法中使用同步块时,退出制度的锁对象还是当前累的类对象.
            获取方式为:当前类的类名.class
         */
        Thread t = Thread.currentThread();

        synchronized (Boo.class) {
            System.out.println(t.getName() + ":正在执行dosome方法....");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(t.getName() + ":执行dosome方法完毕!");
        }
    }
    }
